home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / recio202.zip / rcputs.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  4KB  |  101 lines

  1. /*****************************************************************************
  2.    MODULE: rcputs.c
  3.   PURPOSE: recio column delimited string and char output functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.02
  8.   RELEASE: May 5, 1994
  9. *****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "recio.h"
  16.  
  17. #define rcol(rp)         ((rp)->r_colno)
  18. #define rfp(rp)          ((rp)->r_fp)
  19. #define rflags(rp)       ((rp)->r_flags)
  20. #define rfldch(rp)       ((rp)->r_fldch)
  21. #define rtxtch(rp)       ((rp)->r_txtch)
  22.  
  23. extern int _rstatus(REC *rp, int mode);
  24. extern int _rputc(REC *rp, int ch);
  25.  
  26. /****************************************************************************/
  27. int                          /* return 0 on success; !0 on error            */
  28.     rcputc(                  /* put character to record stream              */
  29.         REC   *rp,           /* record pointer                              */
  30.         size_t col,          /* column position                             */
  31.         int    ch)           /* character to put to record stream           */
  32. /****************************************************************************/
  33. {
  34.     int err=EOF;             /* return error (0=no error; !0=error) */
  35.  
  36.     if (!_rstatus(rp, R_WRITE)) {
  37.         if (col >= rcolno(rp)) {
  38.             rfldno(rp)++;
  39.             /* if colno < col, pad with spaces */
  40.             while (rcolno(rp) < col) {
  41.                 err = _rputc(rp, ' ');
  42.                 if (err) goto done;
  43.             }
  44.             /* put character */
  45.             err = _rputc(rp, ch);
  46.         } else {
  47.             rseterr(rp, R_EINVAL); \
  48.         }
  49.     }
  50. done:
  51.     return err;
  52. }
  53.  
  54. /****************************************************************************/
  55. int                          /* return 0 on success; !0 on error            */
  56.     rcputs(                  /* put string to record stream                 */
  57.         REC  *rp,            /* record pointer                              */
  58.         size_t begcol,       /* beginning column                            */
  59.         size_t endcol,       /* ending column                               */
  60.         char *str)           /* pointer to string                           */
  61. /****************************************************************************/
  62. /* note: assumes str does not contain a newline character */
  63. {
  64.     int err=EOF;             /* return error (0=no error; !0=error) */
  65.     size_t sl;               /* string length */
  66.  
  67.     if (!_rstatus(rp, R_WRITE)) {
  68.         if (endcol >= begcol && begcol >= rcolno(rp)) {
  69.             rfldno(rp)++;
  70.             /* if colno < begcol, pad with spaces */
  71.             while (rcolno(rp) < begcol) {
  72.                 err = _rputc(rp, ' ');
  73.                 if (err) goto done;
  74.             }
  75.  
  76.             sl = strlen(str);
  77.             /* if str is too long for space */
  78.             if (sl > (endcol-begcol+1)) {
  79.                 rsetwarn(rp, R_WWIDTH);
  80.                 /* put as much of the string as possible */
  81.                 while (rcolno(rp) <= endcol) {
  82.                     err = _rputc(rp, *str++);
  83.                     if (err) goto done;
  84.                 }
  85.             } else {
  86.                 err = fputs(str, rfp(rp));
  87.                 if (err==EOF) { 
  88.                     rseterr(rp, R_ENOPUT);
  89.                 } else {
  90.                     err = 0;
  91.                     rcol(rp) += sl;
  92.                 }
  93.             }
  94.         } else {
  95.             rseterr(rp, R_EINVAL); \
  96.         }
  97.     }
  98. done:
  99.     return err;
  100. }
  101.